package io.openim.android.demo.cxc.vm;

import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.util.Log;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import io.openim.android.ouicore.base.BaseApp;
import io.openim.android.ouicore.base.BaseViewModel;
import io.openim.android.ouicore.base.IView;
import io.openim.android.ouicore.base.vm.State;
import io.openim.android.ouicore.entity.MsgConversation;
import io.openim.android.ouicore.im.IMEvent;
import io.openim.android.ouicore.im.IMUtil;
import io.openim.android.ouicore.net.bage.GsonHel;
import io.openim.android.sdk.OpenIMClient;
import io.openim.android.sdk.listener.OnAdvanceMsgListener;
import io.openim.android.sdk.listener.OnBase;
import io.openim.android.sdk.listener.OnConversationListener;
import io.openim.android.sdk.models.ConversationInfo;
import io.openim.android.sdk.models.Message;

public class MyContactListVM extends BaseViewModel<MyContactListVM.ViewAction> implements OnConversationListener, OnAdvanceMsgListener {

    private static final String TAG = "cxc";
    public State<List<MsgConversation>> conversations = new State<>(new ArrayList<>());

//    @Override
//    protected void viewCreate() {
//        IMEvent.getInstance().addConversationListener(this);
//        IMEvent.getInstance().addAdvanceMsgListener(this);
//        updateConversation();
//    }

    ////                     会话的唯一标识符
//                 private java.lang.String conversationID;
////                 会话的类型，可能包括个人会话和群组会话等。
//                 private int conversationType;
////                 用户ID，用于标识个人会话的对方。
//                 private java.lang.String userID;
////                 群组ID，用于标识群组会话的群组。
//                 private java.lang.String groupID;

////                 会话中显示的名称。
//                 private java.lang.String showName;
////                 头像的URL。
//                 private java.lang.String faceURL;
////                 接收消息的选项，可能影响消息的展示或处理。
//                 private int recvMsgOpt;
////                 未读消息的数量。
//                 private int unreadCount;
////                 群组中@某人的类型。
//                 private int groupAtType;
////                 最近一条消息的内容。
//                 private java.lang.String latestMsg;
////                 最近一条消息的发送时间。
//                 private long latestMsgSendTime;
////                 草稿文本，即未发送的消息。
//                 private java.lang.String draftText;
////                 草稿的保存时间。
//                 private long draftTextTime;
////                 会话是否被固定。
//                 private boolean isPinned;
////                 会话是否为私聊。
//                 private boolean isPrivateChat;
////                 ：扩展字段，可能用于存储额外的信息。
//                 private java.lang.String ext;
////                 ：扩展字段，可能用于存储额外的信息。
//                 private java.lang.String ex;
////                 是否不在群组中。
//                 private boolean isNotInGroup;
////                 消息的焚毁时间，用于设置消息的自动删除。
//                 private int burnDuration;
//                 private long msgDestructTime;
////                 消息是否开启焚毁功能。
//                 private boolean isMsgDestruct;


    /**
     * 赋予假数据，查看view
     */
    public void testData(){
        Log.d(TAG, "testData: ");
             conversations.val().clear();
             List<ConversationInfo> data=new ArrayList<>();
             for(int i = 0; i < 10; i++){
                 ConversationInfo info=new ConversationInfo();
                 info.setConversationID("12345"+i);
                 info.setUserID("12"+i);
                 info.setShowName("chat private with "+i);
                 info.setFaceURL("https://www.hao123.com/232/3.jpg");
                 info.setRecvMsgOpt(1);
                 info.setUnreadCount(3);
                 info.setLatestMsg("this is the latest message");
                 data.add(info);
             }
                for (ConversationInfo datum : data) {
                    Message msg = new Message();
                    msg.setSendID("12334234");
                    msg.setRead(false);
                    msg.setContentType(1);
//                    if (null!=datum.getLatestMsg()){
//                        msg = GsonHel.fromJson(datum.getLatestMsg(), Message.class);
//                    }
                    MsgConversation msgConversation=new MsgConversation(msg, datum);
                    CharSequence draft=buildDraftMsg(datum);
                    if (null!=draft)
                        msgConversation.lastMsg=draft;
                    conversations.val().add(msgConversation);
                }
                conversations.setValue(conversations.getValue());
    }

    @Override
    protected void viewCreate() {
        IMEvent.getInstance().addConversationListener(this);
        IMEvent.getInstance().addAdvanceMsgListener( this);
        updateConversation();
    }

    /**
     * 该函数用于删除指定对话及其所有消息。
     * @param conversationId
     */
    public void deleteConversationAndDeleteAllMsg(String conversationId) {
        Log.d(TAG,"deleteConversationAndDeleteAllMsg");

//        OpenIMClient.getInstance().conversationManager
//            .deleteConversationAndDeleteAllMsg(new OnBase<String>() {
//                @Override
//                public void onError(int code, String error) {
//
//                }
//
//                @Override
//                public void onSuccess(String data) {
//                    updateConversation();
//                }
//            }, conversationId);
    }

    /**
     * 更改对话
     */

    public void updateConversation() {
        Log.d(TAG,"updateConversation");
//        OpenIMClient.getInstance().conversationManager.getAllConversationList(new OnBase<List<ConversationInfo>>() {
//            @Override
//            public void onError(int code, String error) {
//                getIView().onErr(error);
//            }
//
//            @Override
//            public void onSuccess(List<ConversationInfo> data) {
//                conversations.val().clear();
//                for (ConversationInfo datum : data) {
//                    Message msg = null;
//                    if (null!=datum.getLatestMsg()){
//                        msg = GsonHel.fromJson(datum.getLatestMsg(), Message.class);
//                    }
//                    MsgConversation msgConversation=new MsgConversation(msg, datum);
//                    CharSequence draft=buildDraftMsg(datum);
//                    if (null!=draft)
//                        msgConversation.lastMsg=draft;
//                    conversations.val().add(msgConversation);
//                }
//                conversations.setValue(conversations.getValue());
//            }
//        });
    }

    /**
     * 该函数根据会话信息生成草稿消息。如果草稿不为空，则将草稿前加上"[草稿]"标签，并设置文本颜色，返回一个可点击的SpannableStringBuilder；否则返回null
     * @param datum
     * @return
     */

    private CharSequence buildDraftMsg(ConversationInfo datum) {
        CharSequence draft= (CharSequence) IMUtil.getDraft(datum.getConversationID())[0];
        if (!TextUtils.isEmpty(draft)){
            String target =
                "[" + BaseApp.inst().getString(io.openim.android.ouicore.R.string.draft) + "]";

            String txt= target+draft;
            return  IMUtil.buildClickAndColorSpannable(new SpannableStringBuilder(txt),
                target, io.openim.android.ouicore.R.color.theme, null);
        }
        return null;
    }


    public void setOneConversationPrivateChat(IMUtil.OnSuccessListener<String> OnSuccessListener,
                                              String cid, boolean isChecked) {
        Log.d(TAG,"setOneConversationPrivateChat");
//        OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat(new OnBase<String>() {
//            @Override
//            public void onError(int code, String error) {
//                getIView().onErr(error);
//            }
//
//            @Override
//            public void onSuccess(String data) {
//                OnSuccessListener.onSuccess(data);
//            }
//        }, cid, isChecked);
    }

    @Override
    public void onConversationChanged(List<ConversationInfo> list) {
        updateConversation();
    }

    private void sortConversation(List<ConversationInfo> list) {
        Log.d(TAG,"sortConversation");
//        创建一个空的msgConversations列表，用于存储新的会话信息。
        List<MsgConversation> msgConversations = new ArrayList<>();
//        获取已有的会话列表conversations的迭代器。
        Iterator<MsgConversation> iterator = conversations.val().iterator();
//        遍历传入的list中的每个ConversationInfo对象
        for (ConversationInfo info : list) {
//            根据每个ConversationInfo对象的最新消息和相关信息，创建一个新的MsgConversation对象，并添加到msgConversations列表中。
            msgConversations.add(new MsgConversation(GsonHel.fromJson(info.getLatestMsg(),
                Message.class), info));
//            遍历迭代器中的每个会话，如果会话的会话ID与当前ConversationInfo对象的会话ID相同，则从迭代器中移除该会话。
            while (iterator.hasNext()) {
                if (iterator.next().conversationInfo.getConversationID()
                    .equals(info.getConversationID()))
                    iterator.remove();
            }
        }
//        将msgConversations列表中的所有会话添加到conversations列表中
        conversations.val().addAll(msgConversations);
//        对conversations列表进行排序，使用IMUtil.simpleComparator()作为排序规则。
        Collections.sort(conversations.val(), IMUtil.simpleComparator());
//        最后将排序后的conversations列表设置为当前conversations的值。
        conversations.setValue(conversations.val());
    }
    //置顶/取消置顶 会话
    public void pinConversation(ConversationInfo conversationInfo, boolean isPinned) {
        Log.d(TAG,"pinConversation");

//        OpenIMClient.getInstance().conversationManager.pinConversation(new OnBase<String>() {
//            @Override
//            public void onError(int code, String error) {
//                toast(error+"("+code+")");
//            }
//
//            @Override
//            public void onSuccess(String data) {
//                conversationInfo.setPinned(isPinned);
//            }
//        }, conversationInfo.getConversationID(), isPinned);
    }

    @Override
    public void onNewConversation(List<ConversationInfo> list) {
        Log.d(TAG,"onNewConversation");
        OnConversationListener.super.onNewConversation(list);
    }

    @Override
    public void onSyncServerFailed() {
        OnConversationListener.super.onSyncServerFailed();
    }

    @Override
    public void onSyncServerFinish() {
        OnConversationListener.super.onSyncServerFinish();
    }

    @Override
    public void onSyncServerStart() {
        OnConversationListener.super.onSyncServerStart();
    }

    @Override
    public void onTotalUnreadMessageCountChanged(int i) {
        OnConversationListener.super.onTotalUnreadMessageCountChanged(i);
    }

    @Override
    public void onConversationUserInputStatusChanged(String s) {
        OnConversationListener.super.onConversationUserInputStatusChanged(s);
    }









    public interface ViewAction extends IView {
        void onErr(String msg);
    }

}
